package com.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Vector;

import com.db.DBManager;

public class JdbcTemplate {
	
	
	/**
	 * 用来执行insert update delete语句
	 * 
	 * @param sql
	 *            是带占位符的sql语句
	 * @param values
	 *            sql占位符具体的值
	 * @return
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 */
	public int update(String sql,Object...values){// insert可能有参数，delect没有参数，update可能有参数
		int r=0;
		PreparedStatement psta = null;
		Connection con=DBManager.getConnection();
		System.out.println(sql);
		try {
			psta=con.prepareStatement(sql);
			for(int i = 0;i<values.length;i++){
				psta.setObject(i+1, values[i]);// 数组从0开始 ，psta从1开始，故进行转化
				// 使用给定对象设置指定参数的值。
			}
			r=psta.executeUpdate();
			// 在此 PreparedStatement 对象中执行 SQL 语句，
			// 该语句必须是一个 SQL 数据操作语言（Data Manipulation Language，DML）语句，
			// 比如 INSERT、UPDATE 或 DELETE 语句；或者是无返回内容的 SQL 语句，比如 DDL 语句
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			if(psta!=null){
				try {
					psta.close();//关闭psta
				} catch (SQLException e) {
					e.printStackTrace();
				}
				psta=null;
			}
		}
		return r;
		
	}
	
	/**
	 * 得到某个表符合条件的数据的总行数
	 * 
	 * @param sql
	 * @return
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public int query(String sql) throws ClassNotFoundException, SQLException {
		int result = 0;
		PreparedStatement psta = null;
		ResultSet rs = null;
		System.out.println(sql);
		try {
			Connection con = DBManager.getConnection();
			psta = con.prepareStatement(sql);
			rs = psta.executeQuery();// 在此 PreparedStatement 对象中执行 SQL 查询，
			// 并返回该查询生成的 ResultSet 对象。
			if (rs.next()) {
				result = rs.getInt(1);// 以 int 的形式获取此 ResultSet 对象的第一行1列的值。
			}
		} finally {
			if (rs != null) {
				rs.close();
				rs = null;
			}
			if (psta != null) {
				psta.close();
				psta = null;
			}
		}
		return result;// 返回此 ResultSet 对象的第一行指定列的值
	}

	
	
	/**
	 * 用来执行select语句
	 * 
	 * @param sql
	 * @param mapping  转换的实体对象
	 *            
	 * @param values
	 * @return
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
    public List query(String sql,EntityMapping mapping,Object...values){
    	List<Object> list=new Vector<Object>();// 可增长的对象数组
    	PreparedStatement psta=null;
    	ResultSet rs=null;
    	Connection con=DBManager.getConnection();
    	System.out.println(sql);
    	try {
			psta=con.prepareStatement(sql);
			for(int i=0;i<values.length;i++){
				psta.setObject(i+1, i);
			}
			rs=psta.executeQuery();// 在此 PreparedStatement 对象中执行 SQL 查询，
			// 并返回该查询生成的 ResultSet 对象。
			while(rs.next()){
				Object entity=mapping.mapping(rs);// 转换为实体对象entity
				list.add(entity);// 将对象entity添加到list链表中
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			if(rs!=null){
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if(psta!=null){
				try {
					psta.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				psta=null;
			}
		}
    	return list;
    }
    
}
